package com.alibaba.excel.read.builder;

import com.alibaba.excel.metadata.AbstractParameterBuilder;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.ReadBasicParameter;
import com.alibaba.excel.util.ListUtils;

/**
 * Build ExcelBuilder
 *
 * @author Jiaju Zhuang
 */
public abstract class AbstractExcelReaderParameterBuilder<T extends AbstractExcelReaderParameterBuilder,
    C extends ReadBasicParameter> extends AbstractParameterBuilder<T, C> {

    public AbstractExcelReaderParameterBuilder() {// 这个类给出了几个配置阅读器的入口，其实就是配置ReadWorkbook
        super();
    }

    /**
     * Count the number of added heads when read sheet.
     *
     * <p>
     * 0 - This Sheet has no head ,since the first row are the data
     * <p>
     * 1 - This Sheet has one row head , this is the default
     * <p>
     * 2 - This Sheet has two row head ,since the third row is the data
     *
     * @param headRowNumber
     * @return
     */
    // 阅读表格时计算添加的头数。
    // 0 - 此工作表没有头，因为第一行是数据
    // 1 - 此工作表有一个行头，这是默认值
    // 2 - 此工作表有两行标题，因为第三行是数据
    public T headRowNumber(Integer headRowNumber) {
        parameter().setHeadRowNumber(headRowNumber);
        return self();
    }

    /**
     * Whether to use scientific Format.
     *
     * default is false
     *
     * @param useScientificFormat
     * @return
     */
    // 是否使用科学格式。默认为假
    //
    // 参数：
    // 使用科学格式——
    public T useScientificFormat(Boolean useScientificFormat) {
        parameter().setUseScientificFormat(useScientificFormat);
        return self();
    }

    /**
     * Custom type listener run after default
     *
     * @param readListener
     * @return
     */
    // 自定义类型侦听器在默认后运行
    //
    // 参数：
    // 读监听器——
    public T registerReadListener(ReadListener<?> readListener) {
        if (parameter().getCustomReadListenerList() == null) {// 如果自定义类型侦听器列表还没初始化，就先初始化
            parameter().setCustomReadListenerList(ListUtils.newArrayList());// 新建一个ArrayList
        }
        parameter().getCustomReadListenerList().add(readListener);// 添加到自定义监听器列表中
        return self();
    }
}
